@ /0

Inicio JP InicioTeste

BufIOFim  K BufIO  ; Ponteiro para fim do buffer IO
BufIO     $ =8
TMP0      K /0
TMP1      K /0
TMP2      K /0
TMP3      K /0
TMP4      K /0
SP        K /0
FP        K /0
FPTMP     K /0
; Constantes Numericas
TrintaHex K /30
CemHex    K /100
DezDec    K =10
DezMilDec K =10000
; Constantes Caracteres
CR        K /d
Sinal     K /2d
Sinal_    K /2d20
; Constantes Operadores
Store     MM /0    ; Base para instrucao de store
Load      LD /0    ; Base para instrucao de load

; TESTE DAS SUB-ROTINAS
InicioTeste LV /fff
SC WRITE_INT
HM /0

; SUB-ROTINA WRITE
; Recebe um caracter no acumulador e imprime
WRITE K /0
* CemHex
PD /100
RS WRITE ; FIM DA SUB-ROTINA WRITE


; SUB-ROTINA WRITE_INT
; Recebe um inteiro no acumulador, converte para a representacao em caracteres e
; imprime (devido a limitacao da MVN o numero aparece quebrado entre diversas linhas)
WRITE_INT K /0

MM TMP1                 ; TMP1 contem o numero a ser impresso
JN NegativoWI           ; Verifica se o numero e negativo
JP IniciaRefWI
NegativoWI LV /0        ; Se negativo corrige numero e imprime sinal
- TMP1
MM TMP1                 ; TMP1 contem o numero a ser impresso
LD Sinal_                
PD /100                 ; Imprime "- "

IniciaRefWI LD DezMilDec
MM TMP2                 ; TMP2 referencia o digito a ser impresso

PulaZerosWI LD TMP2
JZ Imprime0WI           ; Caso a ref. percorreu todo o num., imprime "0"
SC AUX_WRITE_INT        ; Pega o primeiro digito
JZ PulaZerosWI          ; Se o digito for zero, desloca a ref.
+ TrintaHex             ; Converte para caracter (ASCII)
* CemHex                ; Posiciona no buffer (byte mais sig.)
MM BufIO                ; Salvar no buffer
JP PegaD2WI

PegaD1WI LD TMP2        ; Carrega a ref.
JZ FimWI                ; Verifica se a ref. percorreu todo o num.
SC AUX_WRITE_INT        ; Pega proximo digito
+ TrintaHex             ; Converte para caracter (ASCII)
* CemHex                ; Posiciona no buffer (byte mais sig.)
MM BufIO                ; Salvar no buffer
PegaD2WI LD TMP2
JZ ImprimeWI            ; Verifica se a ref. percorreu todo o num.
SC AUX_WRITE_INT        ; Pega proximo digito
+ TrintaHex             ; Converte para caracter (ASCII)
+ BufIO                 ; Posiciona no buffer (byte menos sig.)
MM BufIO                ; Salvar no buffer

ImprimeWI LD BufIO      ; Carrega o buffer IO
PD /100                 ; Imprime na tela o par de caracteres
JP PegaD1WI             ; Reinicia processo de obtencao de dig.

Imprime0WI LV /30       ; Imprime "0"
PD /100

FimWI RS WRITE_INT ; FIM DA SUB-ROTINA WRITE_INT

; SUB-ROTINA AUX_WRITE_INT
; Rotina de uso interno do WRITE_INT
; Atualiza referencias usadas para isolar digito
AUX_WRITE_INT K /0
LD TMP1
/ TMP2      ; Pega valores a esquerda
/ DezDec
* DezDec
MM TMP3
LD TMP1     ; Isola digito
/ TMP2
- TMP3
MM TMP3     ; Guarda o digito
LD TMP2     ; Desloca ref. de TMP2 em um digito para o lado
/ DezDec
MM TMP2
LD TMP3     ; Restaura digito retirado
RS AUX_WRITE_INT

# Inicio